{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 8 统计与计算",
   "id": "6bc847e69ac9afef"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T11:26:23.014154Z",
     "start_time": "2025-01-08T11:26:23.004565Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# 生成顶级索引\n",
    "index1 = pd.MultiIndex.from_arrays(\n",
    "    [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],\n",
    "     [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]],\n",
    "    names=['cloth', 'size']\n",
    ")\n",
    "\n",
    "ser_obj = pd.Series(np.random.randn(12), index=index1)  # 生成Series对象\n",
    "\n",
    "df_obj = ser_obj.unstack(0)  # 转置，生成DataFrame对象\n",
    "print(df_obj)\n",
    "print(\"-\" * 50)\n",
    "\n",
    "df_obj.loc[0, \"b\"] = np.nan  # 给指定位置赋值为NaN\n",
    "print(df_obj)\n",
    "print(\"-\" * 50)\n",
    "\n",
    "#计算最小值有空值时直接跳过\n",
    "print(df_obj.min(axis=0))"
   ],
   "id": "a9811ea481432307",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cloth         a         b         c         d\n",
      "size                                         \n",
      "0      0.192832  0.310971  0.741543  0.061258\n",
      "1     -0.286042 -1.049322 -0.651320  0.986421\n",
      "2      0.408951  0.203380 -0.598214  1.298664\n",
      "--------------------------------------------------\n",
      "cloth         a         b         c         d\n",
      "size                                         \n",
      "0      0.192832       NaN  0.741543  0.061258\n",
      "1     -0.286042 -1.049322 -0.651320  0.986421\n",
      "2      0.408951  0.203380 -0.598214  1.298664\n",
      "--------------------------------------------------\n",
      "cloth\n",
      "a   -0.286042\n",
      "b   -1.049322\n",
      "c   -0.651320\n",
      "d    0.061258\n",
      "dtype: float64\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T11:33:19.384952Z",
     "start_time": "2025-01-08T11:33:19.374243Z"
    }
   },
   "cell_type": "code",
   "source": "print(df_obj.describe())  # 统计描述性统计指标",
   "id": "f68d92ce8b335ddb",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cloth         a         b         c         d\n",
      "count  3.000000  2.000000  3.000000  3.000000\n",
      "mean   0.105247 -0.422971 -0.169330  0.782114\n",
      "std    0.355678  0.885794  0.789286  0.643505\n",
      "min   -0.286042 -1.049322 -0.651320  0.061258\n",
      "25%   -0.046605 -0.736147 -0.624767  0.523839\n",
      "50%    0.192832 -0.422971 -0.598214  0.986421\n",
      "75%    0.300891 -0.109796  0.071664  1.142542\n",
      "max    0.408951  0.203380  0.741543  1.298664\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T11:36:09.544930Z",
     "start_time": "2025-01-08T11:36:09.539090Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(df_obj.loc[:, \"c\"])\n",
    "print(\"-\" * 50)\n",
    "\n",
    "# 计算最小值或者最大值的索引的位置\n",
    "# argmin和argmax只能是series，不能是df\n",
    "print(df_obj.loc[:, \"c\"].argmax())\n",
    "print(df_obj.loc[:, \"c\"].argmin())"
   ],
   "id": "bce91400f48ab186",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "size\n",
      "0    0.741543\n",
      "1   -0.651320\n",
      "2   -0.598214\n",
      "Name: c, dtype: float64\n",
      "--------------------------------------------------\n",
      "0\n",
      "1\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T11:39:21.207502Z",
     "start_time": "2025-01-08T11:39:21.202260Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(df_obj)\n",
    "print(\"-\" * 50)\n",
    "\n",
    "# idxmin和idxmax只能是series，不能是df\n",
    "# 计算最小值或者最大值的索引值\n",
    "# 注意：如果有多个最小值或者最大值，只返回第一个\n",
    "# skipna=True表示跳过空值\n",
    "print(df_obj.idxmin(axis=0, skipna=True))"
   ],
   "id": "9937bad1f322b9db",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cloth         a         b         c         d\n",
      "size                                         \n",
      "0      0.192832       NaN  0.741543  0.061258\n",
      "1     -0.286042 -1.049322 -0.651320  0.986421\n",
      "2      0.408951  0.203380 -0.598214  1.298664\n",
      "--------------------------------------------------\n",
      "cloth\n",
      "a    1\n",
      "b    1\n",
      "c    1\n",
      "d    0\n",
      "dtype: int64\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 实战",
   "id": "45edf968bfb4c137"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T11:50:11.908075Z",
     "start_time": "2025-01-08T11:50:11.884071Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "file_path = \"../pandas_data_read/IMDB-Movie-Data.csv\"\n",
    "df = pd.read_csv(file_path)\n",
    "\n",
    "print(df.info())  # 查看数据信息\n",
    "print(\"-\" * 50)\n",
    "\n",
    "df.head()  # 查看前几行数据"
   ],
   "id": "b3412d3353a87e50",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1000 entries, 0 to 999\n",
      "Data columns (total 12 columns):\n",
      " #   Column              Non-Null Count  Dtype  \n",
      "---  ------              --------------  -----  \n",
      " 0   Rank                1000 non-null   int64  \n",
      " 1   Title               1000 non-null   object \n",
      " 2   Genre               1000 non-null   object \n",
      " 3   Description         1000 non-null   object \n",
      " 4   Director            1000 non-null   object \n",
      " 5   Actors              1000 non-null   object \n",
      " 6   Year                1000 non-null   int64  \n",
      " 7   Runtime (Minutes)   1000 non-null   int64  \n",
      " 8   Rating              1000 non-null   float64\n",
      " 9   Votes               1000 non-null   int64  \n",
      " 10  Revenue (Millions)  872 non-null    float64\n",
      " 11  Metascore           936 non-null    float64\n",
      "dtypes: float64(3), int64(4), object(5)\n",
      "memory usage: 93.9+ KB\n",
      "None\n",
      "--------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "   Rank                    Title                     Genre  \\\n",
       "0     1  Guardians of the Galaxy   Action,Adventure,Sci-Fi   \n",
       "1     2               Prometheus  Adventure,Mystery,Sci-Fi   \n",
       "2     3                    Split           Horror,Thriller   \n",
       "3     4                     Sing   Animation,Comedy,Family   \n",
       "4     5            Suicide Squad  Action,Adventure,Fantasy   \n",
       "\n",
       "                                         Description              Director  \\\n",
       "0  A group of intergalactic criminals are forced ...            James Gunn   \n",
       "1  Following clues to the origin of mankind, a te...          Ridley Scott   \n",
       "2  Three girls are kidnapped by a man with a diag...    M. Night Shyamalan   \n",
       "3  In a city of humanoid animals, a hustling thea...  Christophe Lourdelet   \n",
       "4  A secret government agency recruits some of th...            David Ayer   \n",
       "\n",
       "                                              Actors  Year  Runtime (Minutes)  \\\n",
       "0  Chris Pratt, Vin Diesel, Bradley Cooper, Zoe S...  2014                121   \n",
       "1  Noomi Rapace, Logan Marshall-Green, Michael Fa...  2012                124   \n",
       "2  James McAvoy, Anya Taylor-Joy, Haley Lu Richar...  2016                117   \n",
       "3  Matthew McConaughey,Reese Witherspoon, Seth Ma...  2016                108   \n",
       "4  Will Smith, Jared Leto, Margot Robbie, Viola D...  2016                123   \n",
       "\n",
       "   Rating   Votes  Revenue (Millions)  Metascore  \n",
       "0     8.1  757074              333.13       76.0  \n",
       "1     7.0  485820              126.46       65.0  \n",
       "2     7.3  157606              138.12       62.0  \n",
       "3     7.2   60545              270.32       59.0  \n",
       "4     6.2  393727              325.02       40.0  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Rank</th>\n",
       "      <th>Title</th>\n",
       "      <th>Genre</th>\n",
       "      <th>Description</th>\n",
       "      <th>Director</th>\n",
       "      <th>Actors</th>\n",
       "      <th>Year</th>\n",
       "      <th>Runtime (Minutes)</th>\n",
       "      <th>Rating</th>\n",
       "      <th>Votes</th>\n",
       "      <th>Revenue (Millions)</th>\n",
       "      <th>Metascore</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Guardians of the Galaxy</td>\n",
       "      <td>Action,Adventure,Sci-Fi</td>\n",
       "      <td>A group of intergalactic criminals are forced ...</td>\n",
       "      <td>James Gunn</td>\n",
       "      <td>Chris Pratt, Vin Diesel, Bradley Cooper, Zoe S...</td>\n",
       "      <td>2014</td>\n",
       "      <td>121</td>\n",
       "      <td>8.1</td>\n",
       "      <td>757074</td>\n",
       "      <td>333.13</td>\n",
       "      <td>76.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>Prometheus</td>\n",
       "      <td>Adventure,Mystery,Sci-Fi</td>\n",
       "      <td>Following clues to the origin of mankind, a te...</td>\n",
       "      <td>Ridley Scott</td>\n",
       "      <td>Noomi Rapace, Logan Marshall-Green, Michael Fa...</td>\n",
       "      <td>2012</td>\n",
       "      <td>124</td>\n",
       "      <td>7.0</td>\n",
       "      <td>485820</td>\n",
       "      <td>126.46</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>Split</td>\n",
       "      <td>Horror,Thriller</td>\n",
       "      <td>Three girls are kidnapped by a man with a diag...</td>\n",
       "      <td>M. Night Shyamalan</td>\n",
       "      <td>James McAvoy, Anya Taylor-Joy, Haley Lu Richar...</td>\n",
       "      <td>2016</td>\n",
       "      <td>117</td>\n",
       "      <td>7.3</td>\n",
       "      <td>157606</td>\n",
       "      <td>138.12</td>\n",
       "      <td>62.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>Sing</td>\n",
       "      <td>Animation,Comedy,Family</td>\n",
       "      <td>In a city of humanoid animals, a hustling thea...</td>\n",
       "      <td>Christophe Lourdelet</td>\n",
       "      <td>Matthew McConaughey,Reese Witherspoon, Seth Ma...</td>\n",
       "      <td>2016</td>\n",
       "      <td>108</td>\n",
       "      <td>7.2</td>\n",
       "      <td>60545</td>\n",
       "      <td>270.32</td>\n",
       "      <td>59.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>Suicide Squad</td>\n",
       "      <td>Action,Adventure,Fantasy</td>\n",
       "      <td>A secret government agency recruits some of th...</td>\n",
       "      <td>David Ayer</td>\n",
       "      <td>Will Smith, Jared Leto, Margot Robbie, Viola D...</td>\n",
       "      <td>2016</td>\n",
       "      <td>123</td>\n",
       "      <td>6.2</td>\n",
       "      <td>393727</td>\n",
       "      <td>325.02</td>\n",
       "      <td>40.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 任务1：统计这1000部电影有多少导演和演员",
   "id": "b68fa353cba9a8d2"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:04:02.015124Z",
     "start_time": "2025-01-08T12:04:02.011542Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计导演个数\n",
    "# 读出\"Director\"这一列，转成list，然后用set去重，最后len求长度\n",
    "print(len(set(df[\"Director\"].tolist())))\n",
    "\n",
    "# unique()方法可以统计唯一值个数\n",
    "print(len(df[\"Director\"].unique()))  # 推荐 "
   ],
   "id": "7557f84ea78a8600",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "644\n",
      "644\n"
     ]
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:12:12.175511Z",
     "start_time": "2025-01-08T12:12:12.169325Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计演员个数\n",
    "# 读出\"Actors\"这一列，用逗号分割，转成list\n",
    "tmp_actor_list = df[\"Actors\"].str.split(\",\").tolist()  # 二维列表\n",
    "# print(tmp_actor_list)\n",
    "\n",
    "actor_list = [j for i in tmp_actor_list for j in i]  # 二维列表转一维列表\n",
    "# print(actor_list)\n",
    "\n",
    "print(len(set(actor_list)))"
   ],
   "id": "dbe1bd866b98b450",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2394\n"
     ]
    }
   ],
   "execution_count": 33
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:14:39.606727Z",
     "start_time": "2025-01-08T12:14:39.600652Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 每个演员出演的电影数量\n",
    "\n",
    "# numpy.unique()函数可以统计唯一值个数\n",
    "# return_counts=True表示返回每个值出现的次数\n",
    "u, indices = np.unique(actor_list, return_counts=True)\n",
    "print(u)\n",
    "print(indices)"
   ],
   "id": "9c5cc0e9d94fcb2d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[' 50 Cent' ' A.C. Peterson' ' AJ Michalka' ... 'Zachary Quinto'\n",
      " 'Zoey Deutch' 'Zooey Deschanel']\n",
      "[1 1 1 ... 1 4 2]\n"
     ]
    }
   ],
   "execution_count": 36
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 任务2：电影时长的关系",
   "id": "93110bffa16570ab"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:31:36.445441Z",
     "start_time": "2025-01-08T12:31:36.347491Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# runtime分布关系\n",
    "\n",
    "# 直方图\n",
    "runtime_data = df[\"Runtime (Minutes)\"].values\n",
    "\n",
    "max_runtime = runtime_data.max()\n",
    "min_runtime = runtime_data.min()\n",
    "print(max_runtime, min_runtime)\n",
    "\n",
    "# 计算组数\n",
    "print(max_runtime - min_runtime)\n",
    "num_bin = (max_runtime - min_runtime) // 5\n",
    "print(num_bin)\n",
    "\n",
    "# 设置画布大小\n",
    "plt.figure(figsize=(20, 8), dpi=80)\n",
    "\n",
    "# 第二个bins参数必须为int或sequence或str，bins代表划分为多少个单元\n",
    "plt.hist(runtime_data, bins=num_bin)\n",
    "plt.grid(alpha=0.5)  # 显示网格\n",
    "\n",
    "plt.xlabel(range(min_runtime, max_runtime + 5, 5))\n",
    "\n",
    "plt.show()\n",
    "\n"
   ],
   "id": "a5a2631b8624a7df",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "191 66\n",
      "125\n",
      "25\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1600x640 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABQQAAAIdCAYAAABr4HBGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAMTgAADE4Bf3eMIwAAKFtJREFUeJzt3Q2QVeV5wPFnzQKOCWjUyIcrrnYXEsWoKC3xg49aRiZ2IlFpJgjVVAe0dWyGdOqmzaTt1BJMHTpG24JtBmyZOppgbGbWRpB2QVtjoEWN1kHWsPLhIkLSoqkScLdzTmZ3JAoSdvHuvc/vN3Nn7z13d88Leb259897zqnr7u7uDgAAAAAghWMqPQAAAAAA4IMjCAIAAABAIoIgAAAAACQiCAIAAABAIoIgAAAAACQiCAIAAABAIoIgAAAAACRSHwPQkCFD4mMf+1i8/fbb8aEPfajSw4F+Y05TS8xnaon5TK0xp6kl5jO1xHzmg/Taa6/F3r17qycIFjFw27Zt0d7eHk1NTZUeDvQbc5paYj5TS8xnao05TS0xn6kl5jMfpIaGhoM+55BhAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEikvtIDAICBpLGlNapNx8IrKj0EAACgilghCAAAAACJCIIAAAAAkIggCAAAAACJHFYQvPXWW6OxsTHq6uri6aefLre99dZbMWPGjBgzZkyce+65MW3atGhvb+/9mZ07d8b06dOjubk5xo0bF2vXrj16fwoAAAAAoP+C4DXXXBNPPPFEnH766Qdsnzt3bmzcuDGeeeaZuPLKK+PGG2/sfa6lpSUmTpwYmzZtiqVLl8asWbNi3759hzcqAAAAAKByQXDSpEnR0NBwwLZjjz02Pv3pT5erBgtF/Ovo6Oh9/sEHH4ybbrqpvD9hwoQYNWpUrFmzpn9HDwAAAABU5hyCd911V7lKsLB79+5yNeCIESN6ny8OOd6yZUt/7Q4AAAAAOAL10Q8WLFhQnj9w9erVR/TzixYtKm899uzZU/6+Xbt29cfwYMAwp6kltTqfp4zsimrzznP4cmRqdT6TlzlNLTGfqSXmMzUTBO+888546KGH4rHHHovjjjuu3HbSSSdFfX197Nixo3eVYHE48ejRo9/zd8yfP7+89SgOT25qairv93yFWmFOU0tqcT63dW6MarOsBv93qIRanM/kZk5TS8xnaon5TNUfMlys6rv//vtj1apVccIJJxzw3MyZM2Px4sXl/XXr1sX27dtj8uTJfRstAAAAAHD0VwjOmzcvWltbyxV/l19+eQwdOjTa2triS1/6Upx55pkxderU8vuGDBkSTz31VHn/jjvuiDlz5kRzc3MMHjw4li9fHoMGDerbaAEAAACAox8ElyxZ8p7bu7u7D/ozw4cPj5UrVx75yAAAAACAgXuVYQAAAABg4BMEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEhEEAQAAACARQRAAAAAAEqmv9AAAODyNLa0xkEwZ2RVtnRsP+T0dC6/4wMYDAADA4bFCEAAAAAASEQQBAAAAIBFBEAAAAAAScQ5BAKhyA+38ktXIOTEBAMjECkEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBEBEEAAAAASEQQBAAAAIBE6g/nm2699db47ne/Gy+//HJs2LAhzjvvvHL7pk2b4rrrrotdu3bF8ccfH8uWLYuzzz77fZ8DIIfGltZKDwEAAIAjWSF4zTXXxBNPPBGnn376AdvnzZsXc+fOjRdffDFuu+22uP766w/rOQAAAABgAAfBSZMmRUNDwwHbdu7cGevXr4/Zs2eXj6+++urYunVrtLe3H/I5AAAAAKAKzyFYBL6RI0dGff3Pjzquq6uL0aNHx5YtWw75HAAAAAAwwM8heLQtWrSovPXYs2dPuZqwOP8g1BJzmr6YMrIrBpKmYd0RMbDGBEdzPjvSgWriPQe1xHymlpjPVH0QPO2006KzszP2799frgTs7u4uVwAWKwGHDRt20Ofey/z588tbj+Lw5KampvJ+z1eoFeY0R6qtc2MMLF3R1uli9dSK95/Py7x+U2W856CWmM/UEvOZgeCIP8mdcsopMX78+Fi+fHn5eMWKFb0h71DPAQAAAAADfIVgccXg1tbW2LFjR1x++eUxdOjQ8rCZJUuWlFcPXrBgQbkqcOnSpb0/c6jnAAAAAIABHASLuPdexo4dG08++eQv/RwAAAAAUBlO/gQAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAiQiCAAAAAJCIIAgAAAAAidRXegAAldDY0lrpIQAAAEBFWCEIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQiCAIAAAAAIkIggAAAACQSL8EwUceeSTGjx8f5513XowbNy7uu+++cvvOnTtj+vTp0dzcXG5fu3Ztf+wOAAAAADhC9dFH3d3dMXv27Ghra4tPfvKT0dHRER//+MfjqquuipaWlpg4cWJ873vfi3Xr1sVnP/vZ2Lx5cwwaNKivuwUAAAAAKrVCsK6uLv7nf/6nvL9nz5446aSTYsiQIfHggw/GTTfdVG6fMGFCjBo1KtasWdMfuwQAAAAAKrFCsIiBDzzwQLki8MMf/nD85Cc/iYceeihef/312LdvX4wYMaL3exsbG2PLli193SUAAAAAUKkguH///rj99tvLCDhp0qTy0ODPfOYz8fTTTx/271i0aFF561GsMmxvb49du3b1dXgwoJjTA8eUkV2VHkLVaxrWHRH+Hskzn4v3JlAtvOeglpjP1BLzmZoJgkX4e+WVV8oY2HNocENDQzz77LNRX18fO3bs6F0lWJxfcPTo0e/6HfPnzy9vPYqfb2pqKu/3fIVaYU4PDG2dGys9hBrQFW2dLlZPnvm8zOs3VcZ7DmqJ+UwtMZ8ZCPr8Se60006Lzs7OeOGFF3r/9fyll16KsWPHxsyZM2Px4sXl9mLl4Pbt22Py5Ml9HzUAAAAAUJkVgsOHD4977703fuu3fiuOOeaY6OrqinvuuadcCXjHHXfEnDlzorm5OQYPHhzLly93hWEAAAAAqOYgWPj85z9f3t4rFq5cubI/dgEAAAAA9AMnfwIAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACAROorPQAAgGrQ2NIa1aZj4RWVHgIAAAOQFYIAAAAAkIggCAAAAACJCIIAAAAA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/OEf/mFccsklB2z/yU9+Etdee22sXbs2zj777Hj88cfLx88991z5/De+8Y149tlny8eDBw8+7P0Vigg4Y8aMd23/4z/+4zJQFvsEAMhMEAQAqIAiqn31q1+NRx55pFzV9tu//dtx8803x//93//FW2+9FbNmzYqvfOUr5fcWK+VeeOGF8rmXXnopRowYEd/+9rfjxBNPjH379sXv//7vx2OPPVY+vvjii+M///M/o62trfzZf/zHf4x77rmn/L6PfOQjcffdd8e5555b7uOBBx6IO++8s/y+n/70p/HNb34ztm3bVo6tUOzn/Z57P5MmTXrP7cWf46STTipjYOHSSy+NLVu2xH/913/F+PHj4y//8i/jX//1X8sY+Mvs71CKFYOvvfZa+Xf5iU98os+/DwCgWjlkGACgQj70oQ/FunXryvhVHFa7evXqMogVQW/FihXx/e9/v/d7n3rqqVi2bFn893//d5xyyimxZMmScvu9994bmzZtiueff75cZVesquvx7//+73H//feXK+KK3/sXf/EXZWgsFPstDq097rjjegNdERQXLFhQHsZbBLpiPO/33JEqDj3evXt37yG83/3ud+P111+Pjo6O2LNnT7z66qvxz//8z/Frv/Zr5a2Il4erWM1YHGb8uc99Ln70ox8d8NynPvWpPo8dAKDaWSEIAFAhv/M7v9N7/80334zf/d3fLc+zVxzCu3Xr1vJ+cW69wvTp08sVdT1R64c//GF5v4hbxfn8Bg0aVD6+7rrr4u///u/L+0VQK87LVwS1Hj/+8Y/LfRWr/YYPH37AYcsvv/xynHXWWbFw4cLYsGFDTJs2rQyNh3runb/jl3H88ceXqxy//OUvxxtvvFH+mYrfXxw6XeyvuBXjLEJoEQkvuuii+PjHP16ubjyUYkXkaaedVp6D8K//+q/jN3/zN8uI2qNYaVj82QEAMhMEAQAqpDiEt8cf/dEfxcknn1zGtiKKXXXVVeVhvT2OPfbYA1YWFsHsvfQc0lsoolgRCIuVfb+oWBn4zt8/evToMkQW5/ErnH/++eUKwiI8FofaHuy5Iw2CheJCIT0XCykuWlLEuiIKFqsRi7+bnguXFKsni0Ohi1WN7xcEixjY8/dQXATlD/7gD8qViD0xtfgzFzESACAzhwwDAAwAxUU2Ghoayhi4cePGWLVq1WH93K//+q/HP/3TP5XnCCxu//AP/9D73Gc+85lYvnx5eW6+QnE14fXr15f3iyv7FvvpUcTIyy67LB599NHy8ebNm8tbca69Qz1XKM5/+J3vfOeIrnL8zgucFH+Wpqam8vHnP//58irEPasaf/CDH5RjLhSrCovzIv6iIpIWhxr3KA67LoJlTwwsFOcPfL+oCABQ66wQBAAYAIoLiMyZMyfuu++++JVf+ZUyjh2OefPmlSv1ipV1H/3oR8tz/L3yyivlc8W5/r7+9a/HZz/72TKW/exnP4srrrii/J5ihV8Ry4rDfnsu7LF48eK44YYb4rbbbitXBBbnKTz11FPf97kiMhZX7z3Y+FpbW8urBF9++eUxdOjQaG9vL58rLqpSnPewGFtxyHBx4ZIeX/va1+ILX/hC/M3f/E35uNjvr/7qr5b3i8OgL7jggnftq1hlWPz5iq/FGIuQWZybsEdxcZTi7+o3fuM3DvN/FQCA2lTXXRxLAgBA1SouxlGEtmKFYHFYbxHLioD2fr71rW+VVyMuzrV3pIqr9hYXKjncFY199fbbb5fnVSzOLVhEv19GETWL8wfefvvtR218AADVwApBAIAqV6x4K1bFFefHu+SSSw66Wu8XzZw5szzEtjiU+JeNaz0+9rGPfWAx8J1XZj4SxZ+xONwYACA7KwQBAAAAIBEXFQEAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACARARBAAAAAEhEEAQAAACAyOP/AcklbWhqCuNbAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 44
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:39:06.096161Z",
     "start_time": "2025-01-08T12:39:05.994872Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# rating分布关系\n",
    "\n",
    "# 直方图\n",
    "rating_data = df[\"Rating\"].values\n",
    "\n",
    "max_rating = rating_data.max()\n",
    "min_rating = rating_data.min()\n",
    "print(max_rating, min_rating)\n",
    "\n",
    "# 计算组数\n",
    "print(max_rating - min_rating)\n",
    "# 对不齐的原因是因为9.0-1.9不能整除0.5\n",
    "num_bin = (max_rating - min_rating) // 0.5\n",
    "print(num_bin)\n",
    "\n",
    "# 设置画布大小\n",
    "plt.figure(figsize=(20, 8), dpi=80)\n",
    "\n",
    "# 第二个bins参数必须为int或sequence或str，bins代表划分为多少个单元\n",
    "plt.hist(rating_data, bins=int(num_bin))\n",
    "plt.grid(alpha=0.5)  # 显示网格\n",
    "\n",
    "# plt.xlabel(range(min_rating, max_rating + 0.5, 0.5))\n",
    "# 因为range的步长不支持0.5,自己做一个列表\n",
    "x_label = [min_rating, ]\n",
    "i = min_rating\n",
    "while i <= max_rating + 0.5:\n",
    "    i += 0.5\n",
    "    x_label.append(i)\n",
    "\n",
    "plt.xlabel(x_label)  # 显示标签\n",
    "\n",
    "plt.show()\n",
    "\n"
   ],
   "id": "8f029acb6a5810c8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9.0 1.9\n",
      "7.1\n",
      "14.0\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1600x640 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABQQAAAIdCAYAAABr4HBGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAMTgAADE4Bf3eMIwAAPptJREFUeJzt3Qu8peXcP/5rajqhKdJhmKaRaQaVDuRJSCGRQxEinSjlkKQ8KnKMQXqG8FBOkUgUiUIHKpEUFUI1VFNMhymJVDqs/+tzP/97/9bs9nlm9prd9X6/Xvs1e601e617Xff3vu7r/tynSZ1Op1MAAAAAgCos1+sJAAAAAADGj0AQAAAAACoiEAQAAACAiggEAQAAAKAiAkEAAAAAqIhAEAAAAAAqIhAEAAAAgIpMLsuglVZaqay55pq9noxl1v3331+WX375Xk8GFVJ79IraoxfUHb2i9ugVtUevqD165f6HeO3dcsst5Z577pk4gWDCwBtuuKHXk7HMmjdvXpk5c2avJ4MKqT16Re3RC+qOXlF79Irao1fUHr0y7yFee9OmTRv0NacMAwAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUm93oCAAAAGF8zDj39Qc9tM/WBcu6CK3syPRPRtR99Ua8nAWDMHCEIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVGREgeDdd99ddtpppzJr1qyyySablO22267Mmzevee3mm28uL3jBC8oGG2xQNtpoo3L++ef3/d1QrwEAAAAAy/ARgvvuu2+58sory+WXX1523HHHss8++zTPH3rooWXLLbcsV199dTnuuOPKrrvuWu69995hXwMAAAAAltFAcOWVVy477LBDmTRpUvM4Id+1117b/P6tb32rvPGNb2x+32KLLcpjHvOYct555w37GgAAAAAwQa4hePTRRzdHCd56663NEX/rrLNO32szZswo8+fPH/I1AAAAAKA3Jo/2D+bMmdNcP/Ccc84pd9111xKZiLlz5zY/rTvuuKPvGoU82MKFC3s9CVRK7dErao9eUHf0itpjPGwz9YEHPTdzSqeU8uDnGZht1iVHv0evLKy49kYVCB511FHlO9/5Tjn77LPLwx72sOZn8uTJ5cYbb+w7EjCnEk+fPr2sscYag77W30EHHdT8tKZNm1Zmzpy5+N/uIUz70Ctqj15Re/SCuqNX1B5L27kLrhzg2QfKuQvGdBJZlb5iOV2i9Hv0ysxKa2/EvX2O4DvxxBPLWWedVVZfffW+51/5yleWY445pvn94osvLn/961/Ls5/97GFfAwAAAACW0SMEb7jhhnLwwQeX9ddfv2y77bbNcyuttFK56KKLysc+9rGy++67lw022KCsuOKK5YQTTigrrLBC83+Geg0AAAAAWEYDwZzC2+nkehIPtvbaa5czzzxz1K8BAAAAABPgpiIAAAC9NuPQ03s9CQAwYbliLAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVGRyrycAAABqM+PQ0wd9bZupD5RzF1w5rtMDANTFEYIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQkckj+U8HHHBAOe2008p1111XLr300rLppps2z8+YMaOstNJKZZVVVmkeH3bYYWWXXXZpfr/66qvLnnvuWRYuXFhWW2218pWvfKVsuOGGS/O7AAAAwLiYcejpvZ6ECe/aj76o15MA1RrREYKveMUrygUXXFDWW2+9B7120kknlcsuu6z5acPA2G+//cq+++5brrrqqnLIIYeUvfbaa8lOOQAAAACwdALBrbfeukybNm3Eb3rzzTeXSy65pOy2227N45133rlcf/31Zd68eaOfQgAAAABg2bmG4B577FE23njjsvfee5dbbrmleS7h39SpU8vkyf93RvKkSZPK9OnTy/z58xd/igEAAACApXsNwcGcf/75TdB37733lsMPP7y5ZuAZZ5wx6veZO3du89O64447HE04hFyXEXpB7dErao9eUHcsTdtMfWDQ12ZO6ZRSBn8dlha1x3hrt/utc+mVhRXX3mIFggkDY4UVVigHHnhgmTVrVvN43XXXLQsWLCj33Xdfc5Rgp9Npjg5s/39/Bx10UPPTyunJM2fOXJxJe8jTPvSK2qNX1B69oO5YWs5dcOUQrz5Qzl2w2CfywBioPcbXV7rWs9a59MrMSmtvzL39nXfeWW6//fa+xyeeeGLZbLPNmt/XWmutsvnmm5cTTjiheXzKKacI+QAAAABgohwhmDsGn3766eXGG28s22+/fVl11VXLmWee2dws5P7772+OAFx//fXL8ccf3/c3xx57bHNn4Tlz5pQpU6aU4447bml+DwAAAABgSQWCCfcGcumllw76N7Nnzy4XXnjhSN4eAAAAABgnLhABAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQg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ddVV5ZBDDil77bXX0v5IAAAAAKAXpwzffPPN5ZJLLilnnnlm83jnnXcu+++/f5k3b16ZOXNmqdXinu66zdQHyrkLrlxi00N9xlqDag8AAAAmvqV6hOD1119fpk6dWiZP/r/ccdKkSWX69Oll/vz5S/NjAQAAAIBl+aYic+fObX5aN954Y5k2bVpPp2lZduq//lUe8YhH9HoyqJDao1fUHr2g7ugVtUevqD16Re3RK0895qFde7fccsugr03qdDqdpXnKcE4Nvu2225qjBPNROWLwggsuqPqU4cWVsPSGG27o9WRQIbVHr6g9ekHd0Stqj15Re/SK2qNXplVce0v1lOG11lqrbL755uWEE05oHp9yyilNYwsDAQAAAOAhesrwscce29xZeM6cOWXKlCnluOOOW9ofCQAAAAD0KhCcPXt2ufDCC5f2x1TloIMO6vUkUCm1R6+oPXpB3dErao9eUXv0itqjVw6quPaW6jUEAQAAAICKriEIAAAAACxbBIIAAAAAUBGB4ARx9913l5122qnMmjWrbLLJJmW77bYr8+bN6/VkUYnnP//55clPfnLZdNNNy7Oe9axy6aWX9nqSqExuSDVp0qRy6qmn9npSqMSMGTOa6yCn38vPSSed1OtJogL33HNP2X///csGG2xQNt5447Lbbrv1epKowK233trX1+Un2xuTJ08ut912W68njQqcccYZZfPNN29qb6ONNipf/epXez1JVOJHP/pReepTn9ps52655Zbl8ssvL7VxDcEJFAj+5Cc/KS984QubjeLPfOYz5eSTTy7nnnturyeNCtx+++1l9dVXb37/7ne/W97//vdX2WHSG9dee23ZddddS1ZXhxxySLNzBMYjEEwAnQ0UGC9vf/vby3333Vc+9alPNeO9G2+8sayzzjq9niwqc9RRR5XzzjuvfP/73+/1pPAQl7HdGmus0WzTJpTJmO8JT3hCueWWW8qqq67a68njIezvf/97mTlzZjn//PPLhhtuWH72s5+VN73pTeX3v/99qYkjBCeIlVdeueywww7N4DCSYKfDhPHQhoHxj3/8o68OYWl74IEHyj777FM+/elPl5VWWqnXkwOw1Nx5553lS1/6Uvnwhz/ct54VBtILqcO9996715NBJdLf5eCDuOOOO5qA0JiPpe3Pf/5zU2sJAyNnwc2fP7/85je/KTURCE5QRx99dNlxxx17PRlUZI899ijrrrtuec973lO+9rWv9XpyqMTcuXPLM57xjPKUpzyl15NCpf1eTtvMhnGOVoClvXHyqEc9qsyZM6c5hSkbJ+ecc06vJ4vK/OIXv2iOnHnxi1/c60mhkjAwl+R4+ctfXtZbb73yzGc+szlleMUVV+z1pPEQl0tz3HrrrU2fF6eddlr55z//Wd1BVwLBCSgDxVw/8CMf+UivJ4WKHH/88eX6668vH/rQh5rTNmFpyyH7p5xySjn88MN7PSlUKKeQ/Pa3v232FD/60Y8ue+65Z68niYe4nCp83XXXlSc96UnlkksuaU4b3mWXXcpNN93U60mjsqMDszMk1xCE8ej3sm3xne98p+n/shNk9913LwsXLuz1pPEQt9pqqzWXYDvssMOaAw/OPPPMZv1bW9/nGoIT8Joe3/zmN8vZZ5+9yGmcMJ5WWWWVcsMNNzSHWcPS8rnPfa588IMf7DttJNfSmjJlSvnABz7QXOMDxsuCBQuai+xnzzEsLdkAXnvttct//vOfsvzyyzfPbbHFFs0O4Oc973m9njwq8K9//atMnTq1XHzxxc113GBpy86PXCf6qquu6nsu/V4OgMlNNGE8b+q1zjrrNP1fri1YC0cITrBT50488cRy1llnCQMZN7mmx9/+9re+x7nIfoLAnNYES1NCvwQxOXQ/P7l26uc//3lhIONyLbf2ekaRde9mm23W02nioS9Hoj73uc8tP/7xj5vH11xzTfPzxCc+sdeTRiVy6uYmm2wiDGTc5HJEGev98Y9/bB7nLLhcPmH27Nm9njQqsGDBgr7fjzjiiPKc5zynqjAw6joecgLL0VgHH3xwWX/99cu2227bPJejZi666KJeTxoPcbmJyCtf+cpy1113leWWW66sueaa5Qc/+IEbiwAPWTlFc+eddy73339/cwfErHtz2QRY2o455pjmmpW5NEfWuccee2x57GMf2+vJoqLThd/whjf0ejKoSI6Kzs7eV73qVU2fl5vJfeYznynTp0/v9aRRgfe+973N3YVz6vrTn/70pg+sjVOGAQAAAKAiThkGAAAAgIoIBAEAAACgIgJBAAAAAKiIQBAAAAAAKiIQBAAAAICKLPe+972vPOEJTyj/9V//Vc4999yy6aabLtYb5j1+9KMfLfLc3//+9/La1762zJo1q2y44Ybl0EMPfdDfZTomTZpULrvsskWef+UrX1kuvPDC5vdPfepTZaONNiobb7xxefKTn1xOOOGEYafnJz/5SVl++eXLJz/5yb7n3vGOd5RvfOMbZTzddttt5RnPeEbTvh/+8IfLXnvttcg0jUX+/sYbb1zkufPOO69sscUWTTs/6UlP6mu71l133dU8338+L1iwoGy55ZbNrd7vvvvustNOOzXza5NNNinbbbddmTdv3qDT8fGPf7yZL3nfl73sZeX2229vns/7POUpTyn/+Mc/ynj63ve+V574xCc23/F3v/tdU1ftNI3FtddeW4455phFnsvNud///vc3bZR63HbbbUdUe/GZz3ymfPSjH21+z/zJdOYn82y//fYr99xzz5DT88c//rE87GEPKwceeOAi7zlnzpwynv7zn/+UF7/4xc33f8tb3tK0R/c0jcVXvvKV8qc//WmR5zIPt9lmm2ae5uc73/nOg+bFc57znLL66qsv8vy///3v8tSnPrX885//bB6/7nWva/qNtHWWkXPOOWfQ6VDTY6/p4ebLQG6++eay9tprN/1O6wc/+EHZd999y3jbe++9++Z76rF7msbi1FNPLb/85S8XeW7+/PnlJS95SZk9e3bzWZ/+9Kcf9HdZR/Sfz2nTZz3rWeW6664btk/oL+vlLA9ZBtLXX3755YusZ3/xi1+U8fTnP/+5bL755mWzzTYrxx13XLOMp60WR+o3y2i3U045pannLM/5Se0PV3uR9nnRi17U9zjzIu/T9tc/+9nPhpyWgda1v/3tb8sLX/jCMt4m0jgv83DNNdfsa+e852DU9OLV9EjmWTc1PbaaHsk8a6npsdd0xkZtv5GfGTNmlEc96lFDTstA45SbbrqpPO1pTyv33XdfGU/HHntsU9OZ9l//+tcjGjsNJTX5zW9+c5Hnsn2x//77lw022KBp79122+1Bf5f5nJruP5+z7dy+X7Zju9t6ypQp5aCDDhpwOq6++upmOzLbk1mOTjrppL7XbLsMv+3yq1/9qukLsgzmfY488shhp2egfiljx2uuuaaMp4x9086Z9h//+MfNMtm/rxyNjIf7b2vEZz/72aZt8lmps/79y2Bj5GxnvPGNb+x7/LGPfaxvHZc2T9sP5M4772y2KfN5WWazbsj8nNDrxJVXXrnzt7/9rRM//elPO5tssklncbzvfe/rvO1tb1vkuZ122qnz8Y9/vO/xggULFnn9oosu6rzwhS/srLfeep1LL710keef85zn9D0+++yzO7fffnvz+/z58ztrrLFGZ968eYNOS/7vFlts0Xnxi1/c+cQnPtH3/E033dTZYIMNOvfdd19nvHzzm9/sPP/5z+97vOeeey4yTWPRv73++te/Ns/94Q9/aB7ffffdnb///e+L/M1b3/rWzj777POg+fymN72pc/zxxze/33XXXZ3TTz+988ADDzSPP/3pT3ee/exnDzgNZ555ZueJT3xi54477mgeH3HEEZ03v/nNfa/nO77nPe/pjKcXvOAFnW984xt9j9Pv9m+H0RhoufjkJz/ZednLXta55557BqzpwWrv3//+d+dxj3tc51//+lfz+M477+z85z//aX6///77m2Vl7ty5g05L/u8zn/nMzq677rrIcpbpWH/99fuWj/Hwy1/+sjNr1qwhl/3RSp1997vf7Xuc9kl7/exnP2seZ5m9+eabF/mb//mf/2lqerXVVlvk+Y997GOdD37wg32Pu2vgN7/5TeeRj3xk0+b9qenFq+nh5stAUvevf/3rOzvuuOMiz2+++eadq666qjNebrzxxs7DHvawvnXDcccd96BpGq3+fX361Xyvb33rW4t8brdTTjmlabv+8/mkk05q2mkkfUK32267rfOoRz2q8/vf/755fP7553c23HDDvtezHnnWs57VGU8f/ehHO/vuu++gy/5Y9G+vLOezZ89u1o2RZTp9ykhqL2OStNNg7z2cwda1+ZxzzjmnM54m0jhvpOsRNb34NT3cPOtPTY+tpkcyz0JNL35Nd3vLW97S2X///YeclsHGKamFL33pS53x9IQnPKHzi1/8ovn9mmuuGdHYaSgDjV8OPPDApk3a7bv+NZ3PffrTn97ZcsstF5nPN9xwQzMubv+uW7Y1U7eXXHLJgNOx1VZbdb7whS80v2f8Pn369Ob9wrbL8Nsu6du+973vNb/feuutnTXXXLNzxRVXDDotg/VLmb7dd9+9M57e+MY3dubMmdP3uP80jdZAy8Wpp57a1FhbQ2nn7nxnqDHyRhtt1Ln22mub3zNdqc1//vOfzeOvfe1rzTbPQN71rnc1bZnlIe+fbbTuMf1EXCcmE2waJCv6/m+QgGjjjTdufnbYYYe+Bfi3v/1t5xnPeEZns802azqIbDC3jbn22mt3Hv3oRzfv84EP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/H66lY31zLfBDDdOSU0mNBosPOuWds5GeKRus83Y1l/aK6FKPi9hTcYz3UFC//dp66h7mtK2qYtsvEd2aLZH6yX4bMcEabOMldPe0b+9Lr/88uYzMg7OdCQM6d7BmJ3h2ak60Jgz3+H73//+gNOd2vnUpz41aPtkvqbGImOd9BVte4Vtl6G3Xdoj19IfpibbcHAgQ/VLkXXqYPOxW8at2Q5IzaaucgRee5ZS2itt24Z0CWi7D6Lo/z7d49/uacr7tzsRciZQarw9Wq+7/8h2S3swxUDLasbz2XbKNKauM8YeyRg5IXf/HOjII4/srLLKKk3omn68XY77y3KSsXvmf5a/hLsJ2ybyOnHQm4r89Kc/LS94wQvKYx/72Obxm9/85ub6Uffff39zHZF99tmnOXc651jnekaDnROeazDkHOxXv/rVzTUR3v72tzfn7t97773lrLPOav4252EP5IYbbmiuGdFfzsvP3+Q6BA9/+MMf9Hquq/ehD32oHH300YOeKr3OOus07z8ST3/608vjHve4vt9zTY1Wzod/7nOf2/z+qle9qvns66+/vozG2WefXd7whjeU5ZZbrvk+e+yxR9M2cemll5ZnP/vZzTU1cp77lVde2bT/YG19/vnnl29/+9vl4osvbq5/knPKI9eMeNe73lXWWmutEbdz5NoOuX7gRz7ykQFfz3XGcl2JzNPUQq79E5MnTx5TW++yyy7N366yyirN+e/dbZ32XXXVVZtrmOU6X2m30UjbpY2333775vEzn/nM5nundrMsfeITn2iuc5Brt5x++ulD1nR+Mh8uuuiipg5T17mWyXC1N1Bbp4bav831PfpfZ6K9pkSWwS984QvNdSEGMpp2njlzZnOdgYFqOu2f65dF5uljHvOYpg5HI/Mm77HSSis175f6bms617DI9RVS07keTK6vOdh1LdLOea9cWyXTkP7oTW96U/PaBz7wgfLyl7+8uW7ESGs6157Id/3Wt75V3vnOdzbXEulPTS9eTQ81X7pl+l7/+tc315BJ2wxkNO288sorN587UE1H1lmx/vrrl6233rrpK0cj8ybzsr3eS+qwrelbb721ub5TajrXhMnj3//+9wO+T9o569L3vOc9TU1n3qUO4otf/GKZPn168x79LVy4sKmTRzziESPuE1qrrbZaOfnkk8thhx3WXAPzzDPPbK6TMtaa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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 47
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 任务3：电影类型分布",
   "id": "497a63fc2e99e968"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:39:52.252652Z",
     "start_time": "2025-01-08T12:39:52.247945Z"
    }
   },
   "cell_type": "code",
   "source": "print(df[\"Genre\"].head())  # 看前几条数据，掌握格式",
   "id": "efb7a41f9958f0f9",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0     Action,Adventure,Sci-Fi\n",
      "1    Adventure,Mystery,Sci-Fi\n",
      "2             Horror,Thriller\n",
      "3     Animation,Comedy,Family\n",
      "4    Action,Adventure,Fantasy\n",
      "Name: Genre, dtype: object\n"
     ]
    }
   ],
   "execution_count": 48
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:55:37.867152Z",
     "start_time": "2025-01-08T12:55:37.855527Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计分类的列表\n",
    "tmp_list = df[\"Genre\"].str.split(\",\").tolist()  # 二维列表\n",
    "\n",
    "# 二维转一维\n",
    "genre_list = list(set([j for i in tmp_list for j in i]))  # 去重生成唯一元素的列表\n",
    "print(len(genre_list))  # 统计分类的个数\n",
    "\n",
    "print(df.shape)\n",
    "\n",
    "# 构造全为0的DataFrame，行是原来的样本数，列是题材类型数目\n",
    "zero_df = pd.DataFrame(np.zeros((df.shape[0], len(genre_list))),columns=genre_list)\n",
    "\n",
    "# print(zero_df.head())"
   ],
   "id": "6ecb27b27470961",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20\n",
      "(1000, 12)\n",
      "   Musical  History  Fantasy  Crime  Sci-Fi  Horror  Thriller  Western  \\\n",
      "0      0.0      0.0      0.0    0.0     0.0     0.0       0.0      0.0   \n",
      "1      0.0      0.0      0.0    0.0     0.0     0.0       0.0      0.0   \n",
      "2      0.0      0.0      0.0    0.0     0.0     0.0       0.0      0.0   \n",
      "3      0.0      0.0      0.0    0.0     0.0     0.0       0.0      0.0   \n",
      "4      0.0      0.0      0.0    0.0     0.0     0.0       0.0      0.0   \n",
      "\n",
      "   Adventure  Action  Music  Family  Romance  Mystery  Sport  Animation  \\\n",
      "0        0.0     0.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
      "1        0.0     0.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
      "2        0.0     0.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
      "3        0.0     0.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
      "4        0.0     0.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
      "\n",
      "   Comedy  Biography  War  Drama  \n",
      "0     0.0        0.0  0.0    0.0  \n",
      "1     0.0        0.0  0.0    0.0  \n",
      "2     0.0        0.0  0.0    0.0  \n",
      "3     0.0        0.0  0.0    0.0  \n",
      "4     0.0        0.0  0.0    0.0  \n"
     ]
    }
   ],
   "execution_count": 51
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:57:09.628880Z",
     "start_time": "2025-01-08T12:57:09.093674Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 给每个电影出现分类的位置赋值1\n",
    "for i in range(df.shape[0]):\n",
    "    # temp_list是二维列表，temp_list[i]是一个一维列表\n",
    "    # temp_list[i]是一个列表，里面是分类\n",
    "    zero_df.loc[i,tmp_list[i]]=1\n",
    "\n",
    "zero_df.head()"
   ],
   "id": "563a2dfc4d4b5d96",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   Musical  History  Fantasy  Crime  Sci-Fi  Horror  Thriller  Western  \\\n",
       "0      0.0      0.0      0.0    0.0     1.0     0.0       0.0      0.0   \n",
       "1      0.0      0.0      0.0    0.0     1.0     0.0       0.0      0.0   \n",
       "2      0.0      0.0      0.0    0.0     0.0     1.0       1.0      0.0   \n",
       "3      0.0      0.0      0.0    0.0     0.0     0.0       0.0      0.0   \n",
       "4      0.0      0.0      1.0    0.0     0.0     0.0       0.0      0.0   \n",
       "\n",
       "   Adventure  Action  Music  Family  Romance  Mystery  Sport  Animation  \\\n",
       "0        1.0     1.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
       "1        1.0     0.0    0.0     0.0      0.0      1.0    0.0        0.0   \n",
       "2        0.0     0.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
       "3        0.0     0.0    0.0     1.0      0.0      0.0    0.0        1.0   \n",
       "4        1.0     1.0    0.0     0.0      0.0      0.0    0.0        0.0   \n",
       "\n",
       "   Comedy  Biography  War  Drama  \n",
       "0     0.0        0.0  0.0    0.0  \n",
       "1     0.0        0.0  0.0    0.0  \n",
       "2     0.0        0.0  0.0    0.0  \n",
       "3     1.0        0.0  0.0    0.0  \n",
       "4     0.0        0.0  0.0    0.0  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Musical</th>\n",
       "      <th>History</th>\n",
       "      <th>Fantasy</th>\n",
       "      <th>Crime</th>\n",
       "      <th>Sci-Fi</th>\n",
       "      <th>Horror</th>\n",
       "      <th>Thriller</th>\n",
       "      <th>Western</th>\n",
       "      <th>Adventure</th>\n",
       "      <th>Action</th>\n",
       "      <th>Music</th>\n",
       "      <th>Family</th>\n",
       "      <th>Romance</th>\n",
       "      <th>Mystery</th>\n",
       "      <th>Sport</th>\n",
       "      <th>Animation</th>\n",
       "      <th>Comedy</th>\n",
       "      <th>Biography</th>\n",
       "      <th>War</th>\n",
       "      <th>Drama</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 52
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T12:59:00.737127Z",
     "start_time": "2025-01-08T12:59:00.731562Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计每个分类的电影的数量和\n",
    "genre_count=zero_df.sum(axis=0)  # 统计每种分类的数量\n",
    "print(type(genre_count)) # 输出类型为Series\n",
    "print(genre_count)\n"
   ],
   "id": "37f42a8085cc9af1",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.series.Series'>\n",
      "Musical        5.0\n",
      "History       29.0\n",
      "Fantasy      101.0\n",
      "Crime        150.0\n",
      "Sci-Fi       120.0\n",
      "Horror       119.0\n",
      "Thriller     195.0\n",
      "Western        7.0\n",
      "Adventure    259.0\n",
      "Action       303.0\n",
      "Music         16.0\n",
      "Family        51.0\n",
      "Romance      141.0\n",
      "Mystery      106.0\n",
      "Sport         18.0\n",
      "Animation     49.0\n",
      "Comedy       279.0\n",
      "Biography     81.0\n",
      "War           13.0\n",
      "Drama        513.0\n",
      "dtype: float64\n"
     ]
    }
   ],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-08T13:04:45.382989Z",
     "start_time": "2025-01-08T13:04:45.273449Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 排序\n",
    "genre_count=genre_count.sort_values() \n",
    "\n",
    "x_label=genre_count.index\n",
    "y_label=genre_count.values\n",
    "\n",
    "# 画图\n",
    "plt.figure(figsize=(20, 8), dpi=80)\n",
    "plt.bar(range(len(x_label)), y_label,width=0.4,color='g')\n",
    "plt.xticks(range(len(x_label)), x_label)\n",
    "\n",
    "plt.show()"
   ],
   "id": "b87bda4cf080ef1a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1600x640 with 1 Axes>"
      ],
      "image/png": "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ABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFCREQWCTzzxRNlvv/3KzJkzy/bbb1/e/OY3lzvvvLMZtnTp0rLPPvuUrbbaqmyzzTblqquu6v6/oYYBAAAAABO4h+Ds2bPL7bffXn7wgx+Ufffdtxx11FHN5yeeeGLZZZddysKFC8v8+fPLwQcfXJ566qlhhwEAAAAAEzQQfMELXlDe+ta3lr6+vuZ9Qr677767eX3++eeXY445pnk9a9assskmm5Qrr7xy2GEAAAAAwCS5h+AnP/nJppfgQw891PT422ijjbrDNt9887Jo0aIhhw00b968Mn369O7fsmXLVnR+AAAAAICxDATnzp3b3D/wlFNOKWPl+OOPL4sXL+7+rbnmmmM2bgAAAABgBQPB008/vVx00UXl8ssvLy960YvKuuuuW6ZNm1buv//+7ndyKfGMGTOGHAYAAAAATPBAMJf1nnvuueUb3/hGWWeddbqfH3jggeXMM89sXt9www3l3nvvLbvvvvuwwwAAAACAVW/aSL6Uy3g/8IEPlC222KLssccezWdrrLFG+d73vldOO+20cuihh5atttqqrL766mXBggVltdVWa74z1DAAAAAAYIIGgnnQR6fTWe6wDTfcsHz9618f9TAAAAAYb30n9fVs3J05yz+OBpiUTxkGAAAAACYngSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAAAABQEYEgAAAAAFREIAgAAAAAFREIAgAAAEBFBIIAAAAAUBGBIAAAAABURCAIAAAAABURCAIAAABARQSCAAAAAFARgSAAAAAAVEQgCAAAAAAVEQgCAAAAQEUEggAA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73//++Xggw8ut99+e/eznXfeuZx66qllzz337H42b9685q91//33l4022qhXkzXpLFu2rKy55pplqjOfU4v5nFpqmc+a5tV8Ti3mc2oxn1OL+ZxaapnPmubVfE4ttcznSD344IPlySefnLgPFTn++OObP5Zv+vTpZfHixWWqM59Ti/mcWmqZz5rm1XxOLeZzajGfU4v5nFpqmc+a5tV8Ti21zOeEv2R40003LUuWLClPP/108z6dERctWlRmzJjRy58FAAAAAMYjENxggw3KjjvuWBYsWNC8v/DCC5u0dsstt+zlzwIAAAAAg+j5JcNnnXVW82ThuXPnlrXWWqvMnz+/1z855dRyObX5nFrM59RSy3zWNK/mc2oxn1OL+ZxazOfUUst81jSv5nNqqWU+J/xDRQAAAACAii4ZBgAAAAAmFoEgAAAAAFREIAgAAAAAFREI9sDmm2/ePGH5qaee6n52xRVXlL6+vvLnf/7nKzTOM888s3zsYx9b4Wn63Oc+V/bbb7+ysk466aRy1FFHdd9fc801zXx9+9vf7n52zDHHlL/9278d9bj//u//vjzxxBNlsurlshkvE7Es99JFF11Udtppp7LDDjuUV77ylWXPPfcszz777JiNP2Xhq1/9alnV6/CWW255zme/+7u/Wy655JLyd3/3d+ULX/jCsHXHT37ykzLefvWrX5U111yzHHnkkSP6/o033lje+c53juk0ZDn+x3/8x3M+S1nJtK1qWa9bb7118/v561/3rIy3vvWt5fbbb39OOenltL/qVa8qBx98cHnsscfKf/3Xf5W/+Iu/KBPF8radibb+sn6uu+66UtM+ZLK0FYaqe6eq0e5DU+5THgZbz+uvv353G8nffffd15M6t//2mH9PPfXUUrOnn366adNmHW6zzTbNcpk9e3Z55JFH/n/fHUk7YqJoy9GrX/3q8vznP7/7Pm2FtM/yekXasv2PsUY7nl62iT74wQ8221GvfOITnyj3339/mcjls9cOOOCAZv1P1PbwwOOO1KFvfOMby0TW1sfbb7992XLLLcu+++5bvvvd7473ZE1pPX/KcK1mzJjRHNzsv//+zft//dd/La997WtXeHwJkiaCPfbYo7z73e/uvk9D7nWve11T4aSh236WHeVopXLPAcILXvCCUe8Ypk2bNuWWzUSZr6lalgdasmRJ06D4/ve/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32/91m91Lr744s7hhx/e+fjHP958b7vttut897vf7S6LdlvM+sx3W5/61Keaz1LGn3rqqc5b3vKWzqmnntoMy/gynl/+8pfN+4xj/fXX745r3rx5nXe/+92jnofbbrut87KXvawpG1/60pc6r3/964fd7q+44opmXqNdF+18fPazn22Wwbe+9a3mfdb1AQcc0LwebT3a1lsjKQsXXHBBM+zyyy9v1slYrteMu6038nv57ayjyPraf//9m/nJNpZl9t73vrf5fsp4lkW7jtptvv1/7TI7+OCDO2eddVbz+v7772/Wa7ucVmbasz/Yc889m7LUf/ledtllnVe+8pXd6cr+4Jhjjmlef/CDH2zKWqY/ZW2bbbZp3kfG8cIXvrDzk5/8pPt7w9W5y9u222Hve9/7mtcZluXW1gm77rpr52tf+1rz+qabbupsueWWo6q3R7v+UidlGWXfufnmm3e31f7b8HDl9+1vf3vni1/8Yve7KQtjvW5Huw85++yzO+9617u630/9cdVVV/WsrZBykWlq9zPZT334wx8ek3kdTd170EEHNcshHnjggc706dObsrm8dkCW1cYbb9ysm/jhD3/YlI+2LJ588smdffbZZ9DyP9770JTbrbba6jllL9vT8vYv/WW+11tvve6yO+KII5a7/sdC/3rvxz/+cdNuS72x8847d84888zm8zvuuKPz0pe+tHP33Xd3p+MTn/hE8/qb3/xms26z/OP888/vvPa1r21eZz3+/Oc/775OPXbKKad091PPf/7zO9ddd13zPtvHXnvt1by+/fbbm20x0xMpw2krZd532GGHzn333dddlqm32vKwss4777xmO1yeTG9fX1/n29/+dvez/nVQ1lnavtl+M6+77bZb53Wve11TT6ccZD1eeumlw263vZY6NvXLwHkbbF0M157rv+/q3/a46667Orvsskvn0Ucfbd4vXLiws9FGGzV1+/KW5cq2idKO+dCHPtS8TnnI9pPpbJf3xz72se7yzn7k1ltvbcax0047dctZ6tptt922c/311zfvM9+nn3568zrfWXPNNZt1OXC7GbhM4owzzhh037yi5Xio8jlUu2Gsyma267QhI8tv9dVX7273vdyXDrfuUz8ee+yxTT3cv90zcJ30L/vZ96ROy3zEggULOq961auaeR5qe+i1geUqLrroombaBu4P+89r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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 57
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
